use anyhow::Result;
use log::info;
use std::sync::Arc;
mod config;
use crate::config::Config;
mod db;
use crate::db::DatabaseManager;
mod shutdown;
mod routes;
mod error;
use crate::routes::router;

// 配置与参数解析独立模块



#[tokio::main]
async fn main() -> Result<()> {
    // 解析配置
    let config = Config::from_args_and_env();

    // 初始化日志系统
    env_logger::Builder::from_default_env()
        .filter_level(config.log_level)
        .init();

    info!("正在启动 RocksDB REST API...");
    info!("配置信息: ip={}, port={}, log_level={}, path= {}", config.ip, config.port, config.log_level, config.db_path);

    // 初始化数据库管理器
    let db_manager = Arc::new(DatabaseManager::new(config.db_path.clone()));

    // Axum 路由定义
    let app = router().with_state(db_manager.clone());

    info!("🚀 RocksDB REST 启动中...");
    info!("  GET    /api/{{name}}/{{key}}     - 获取值");
    info!("  HEAD   /api/{{name}}/{{key}}     - 返回返回值大小 (X-Value-Length)");
    info!("  PUT    /api/{{name}}/{{key}}     - 设置值(支持二进制)");
    info!("  DELETE /api/{{name}}/{{key}}     - 删除");
    info!("  GET    /api/{{name}}             - 列出所有键");
    info!("  POST   /api/{{name}}/_mget       - 批量获取");

    // 解析IP地址
    let ip_addr: std::net::IpAddr = config.ip.parse()
        .map_err(|e| anyhow::anyhow!("无效的IP地址 '{}': {}", config.ip, e))?;

    // 启动服务器，并支持优雅关闭
    let listener = tokio::net::TcpListener::bind((ip_addr, config.port)).await?;

    info!("服务器启动在 http://{}:{}", config.ip, config.port);
    info!("按 Ctrl+C 可以优雅关闭服务器");

    axum::serve(listener, app)
        .with_graceful_shutdown(shutdown::wait_for_shutdown())
        .await
        .map_err(|e| anyhow::anyhow!("服务器运行出错: {}", e))?;
    info!("服务器已关闭");

    Ok(())
}
// 处理器已抽离到 routes 模块
